home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-03-22 | 10.5 KB | 449 lines | [TEXT/KAHL] |
- //#define DEBUG 1
- // General procedures for 'puriTEXT'
- // Copyright (C) 1994 by Mizutori Tetsuya, 94/3/9, 94/3/21
-
- #include <AppleEvents.h>
- #include <GestaltEqu.h>
- #include "Defines.h"
-
- // Prototypes (generals.c)
- /***** Do Error Messages *****/
- void ErrorMessage( OSErr err, StringPtr string, Boolean fatal );
- void StopMessage( long errCode, StringPtr str1, StringPtr str2,long value );
- void NoteMessage( long errCode, StringPtr str1, StringPtr str2,long value );
- Boolean CautionMessage( long errCode, StringPtr str1, StringPtr str2,long value );
- void SetupParam( long errCode, StringPtr str1, StringPtr str2, long value );
- /***** Gestalt check *****/
- void GestaltCheck( OSType gestaltCode );
- /***** Get Text from resource *****/
- StringPtr GetIndText( long code, StringPtr text );
- /***** Pstring *****/
- //void TypToString( OSType type, StringPtr str );
- //void StringToTyp( StringPtr str, OSType *type );
- StringPtr Pstrcpy( StringPtr dst, const StringPtr src );
- StringPtr Pstrcat( StringPtr dst, const StringPtr src );
- short Pstrcmp( const StringPtr dst, const StringPtr src );
- short Pstrncmp( const StringPtr dst, const StringPtr src, Size k );
- /***** Read & Write resource *****/
- Boolean LoadRsrcPREF( PrefDataPtr dataBlock );
- void SaveRsrcPREF( PrefDataPtr dataBlock );
- /***** Window operations *****/
- void GetWindowRect( WindowPtr window, Rect *rect );
- /***** Dialog operations *****/
- Handle IGetTxtHand( DialogPtr dialog, short item );
- ControlHandle IGetCtlHand( DialogPtr dialog, short item );
- /***** Standard File Get & Put *****/
- Boolean GetFileDialog( short numTypes, SFTypeList typeList, FSSpec *theFSSpec );
- Boolean PutFileDialog( StringPtr prompt, Boolean *replacing, FSSpec *theFSSpec );
- /***** Menu Operation *****/
- short GetMenuInd( MenuHandle menu, StringPtr text );
- short TrackPopupMenu( ControlHandle theCntl );
- // end of Prototypes
-
- // Define macros
- #define EOS '\0'
- #define min(a,b) ( (a)<(b) ? (a) : (b) )
- #define COPY(d,s) (*(d++)=*(s++))
- #define rCOPY(d,s) (*(d--)=*(s--))
- #define CharNumb(c) ((long) (unsigned char) (c))
- #define SIGN(n) ( (n)>0 ? 1 : ( (n)==0 ) ? 0 : -1 )
-
- #define DEFVARlong(n) \
- register long n;
-
- #define DEFVARlongs(n,m) \
- register long n;\
- register long m;
-
- #define DEFVARptr(d) \
- register char * d;\
- d = (char *) dst;
-
- #define DEFVARptrs(d,s) \
- register char * d;\
- register char * s;\
- d = (char *) dst;\
- s = (char *) src;
-
-
- /***** Do Error Messages *****/
- void ErrorMessage( OSErr err, StringPtr string, Boolean fatal )
- {
- Str31 text;
-
- NumToString( (long) err, text );
-
- ParamText( string, "\p\rError = ", text, "\p" );
- StopAlert( kAlertID, kNilFilterProc );
-
- if ( fatal ) ExitToShell();
- }
-
- void StopMessage( long errCode, StringPtr str1, StringPtr str2,long value )
- {
- SetupParam( errCode, str1, str2, value );
- StopAlert( kNoteAlertID, kNilFilterProc );
- }
-
- void NoteMessage( long errCode, StringPtr str1, StringPtr str2,long value )
- {
- SetupParam( errCode, str1, str2, value );
- NoteAlert( kNoteAlertID, kNilFilterProc );
- }
-
- Boolean CautionMessage( long errCode, StringPtr str1, StringPtr str2,long value )
- {
- short item;
-
- SetupParam( errCode, str1, str2, value );
- item = CautionAlert( kCautionAlertID, kNilFilterProc );
-
- return( item == ok );
- }
-
- void SetupParam( long errCode, StringPtr str1, StringPtr str2, long value )
- {
- short strListID, index;
- Str255 text;
- Str31 valueString;
-
- strListID = HiWord( errCode );
- index = LoWord( errCode );
-
- NumToString( value, valueString);
-
- GetIndString( text, strListID, index );
-
- ParamText( text, str1, str2, valueString );
- }
-
- /***** Gestalt check *****/
- void GestaltCheck( OSType gestaltCode )
- {
- StringPtr s1,s2,s3,s4;
- long feature, mask;
- Boolean result;
- OSErr err;
-
- switch ( gestaltCode ) {
- case gestaltProcessorType:
- mask = gestalt68020;
- s1 = "\pError: Problem in calling Gestalt!";
- s2 = "\pSorry, this program requires 68020 CPU, or later.";
- break;
- case gestaltSystemVersion:
- mask = 0x0700;
- s1 = "\pError: Problem in calling Gestalt!";
- s2 = "\pSorry, this program requires System 7, or later.";
- break;
- case gestaltAppleEventsAttr:
- mask = gestaltAppleEventsPresent;
- s1 = "\pError: Problem in calling Gestalt!";
- s2 = "\pError: Apple events not available!";
- break;
- case gestaltStandardFileAttr:
- mask = gestaltStandardFile58;
- s1 = "\pError: Gestalt for Standard File Package";
- s2 = "\pError: Gestalt for The new Standard File Package";
- break;
- case gestaltFSAttr:
- mask = gestaltHasFSSpecCalls;
- s1 = "\pError: File System Attributes is not supported.";
- s2 = "\pError: The new FSSpec File Manager is not supported.";
- break;
- default:
- mask = 0;
- s1 = "\pError: Gestalt for Unknown";
- s2 = "\pError: Gestalt for Unknown";
- break; }
-
- err = Gestalt( gestaltCode, &feature );
- if ( err != noErr ) ErrorMessage( err, s1, true );
-
- switch ( gestaltCode ) {
- case gestaltProcessorType:
- case gestaltSystemVersion:
- result = ( feature >= mask );
- break;
- case gestaltAppleEventsAttr:
- case gestaltStandardFileAttr:
- case gestaltFSAttr:
- result = ( feature & (1L<<mask) != 0 );
- break;
- default:
- result = false;
- break; }
-
- if ( ! result ) ErrorMessage( err, s2, true );
- }
-
- /***** Get Text from resource *****/
- StringPtr GetIndText( long code, StringPtr text )
- {
- short strListID, index;
-
- strListID = HiWord( code );
- index = LoWord( code );
-
- GetIndString( text, strListID, index );
-
- return( text );
- }
-
- /***** Pstring *****/
- #ifdef TYPE2STRING
- void TypToString( OSType type, StringPtr str )
- {
- str[0] = 4;
- BlockMove( &type, &str[1], 4 );
- }
-
- void StringToTyp( StringPtr str, OSType *type )
- {
- BlockMove( &str[1], type, 4 );
- }
- #endif TYPE2STRING
-
- StringPtr Pstrcpy( StringPtr dst, const StringPtr src )
- {
- DEFVARlong(n)
- DEFVARptrs(d,s)
-
- n = CharNumb(*s);
- while( n-- >= 0 ) COPY(d,s);
-
- return( dst );
- }
-
- StringPtr Pstrcat( StringPtr dst, const StringPtr src )
- {
- DEFVARlong(n)
- DEFVARptrs(d,s)
-
- n = CharNumb(*d);
- d += n;
- n = CharNumb(*s);
- *dst = CharNumb(*dst) + CharNumb(*src);
-
- ++d; ++s;
- while ( --n >= 0 ) COPY(d,s);
-
- return( dst );
- }
-
- short Pstrcmp( const StringPtr dst, const StringPtr src )
- {
- DEFVARlongs(n,m)
- DEFVARptrs(d,s)
-
- m = min( CharNumb(*d), CharNumb(*s) );
- for ( n=0; n<=m; ++n ) {
- if ( d[n] != s[n] ) break; }
-
- if ( n > m ) n = 0;
- return( SIGN( CharNumb(d[n]) - CharNumb(s[n]) ) );
- }
-
- short Pstrncmp( const StringPtr dst, const StringPtr src, Size k )
- {
- DEFVARlongs(n,m)
- DEFVARptrs(d,s)
-
- if ( k == 0 ) return( 0 );
-
- m = min( CharNumb(*d), CharNumb(*s) );
- for ( n=1; (n<=m) && (n<=k); ++n ) {
- if ( d[n] != s[n] ) break; }
-
- if ( n == k+1 ) return( 0 );
- if ( n > m ) n = 0;
- return( SIGN( CharNumb(d[n]) - CharNumb(s[n]) ) );
- }
-
- /***** Read & Write resource *****/
- //#define kPrefType 'PREF'
- //#define kPrefID 128
-
- /***** Read & Write resource *****/
- Boolean LoadRsrcPREF( PrefDataPtr dataBlock )
- {
- Handle theHandle;
-
- theHandle = GetResource( kPrefType, kPrefID );
-
- if ( theHandle == nil ) return( false );
-
- HLock( theHandle );
- *dataBlock = *(PrefDataPtr) (*theHandle);
- HUnlock( theHandle );
-
- ReleaseResource( theHandle );
-
- return( true );
- }
-
- void SaveRsrcPREF( PrefDataPtr dataBlock )
- {
- Handle theHandle;
- OSErr err;
-
- theHandle = GetResource( kPrefType, kPrefID );
-
- if ( theHandle == nil ) {
- err = PtrToHand( dataBlock, &theHandle, sizeof(*dataBlock) );
- AddResource( theHandle, kPrefType, kPrefID, "\pDefaults" );
- } else {
- SetResourceSize( theHandle, sizeof(*dataBlock) );
- *(PrefDataPtr) (*theHandle) = *dataBlock;
- ChangedResource( theHandle );
- }
-
- if ( ResError() == noErr ) {
- WriteResource( theHandle ); }
-
- ReleaseResource( theHandle );
- }
-
- /***** Window operations *****/
- void GetWindowRect( WindowPtr window, Rect *rect )
- {
- Rect wRect;
- GrafPtr oldPort;
-
- GetPort( &oldPort );
- SetPort( (GrafPtr) window );
-
- wRect = ((GrafPtr)window)->portRect;
-
- LocalToGlobal( &topLeft( wRect ) );
- LocalToGlobal( &botRight( wRect ) );
-
- *rect = wRect;
-
- SetPort( oldPort );
- }
-
- /***** Dialog operations *****/
- Handle IGetTxtHand( DialogPtr dialog, short item )
- {
- short iType;
- Handle iHndl;
- Rect iRect;
-
- GetDItem( dialog, item, &iType, &iHndl, &iRect );
-
- return( iHndl );
- }
-
- ControlHandle IGetCtlHand( DialogPtr dialog, short item )
- {
- return( (ControlHandle) IGetTxtHand( dialog, item ) );
- }
-
- /***** Standard File Get & Put *****/
- Boolean GetFileDialog( short numTypes, SFTypeList typeList, FSSpec *theFSSpec )
- {
- StandardFileReply reply;
-
- GestaltCheck( gestaltStandardFileAttr );
-
- StandardGetFile( kNilFilterProc, numTypes, typeList, &reply );
-
- if ( ! reply.sfGood ) return( false ); // return by "Cancel"
-
- *theFSSpec = reply.sfFile;
-
- return( true ); // return by "Open"
- }
-
- Boolean PutFileDialog( StringPtr prompt, Boolean *replacing, FSSpec *theFSSpec )
- {
- StandardFileReply reply;
- StringPtr defaultName;
-
- GestaltCheck( gestaltStandardFileAttr );
-
- defaultName = theFSSpec->name;
-
- StandardPutFile( prompt, defaultName, &reply );
-
- if ( ! reply.sfGood ) return( false ); // return by "Cancel"
-
- *replacing = reply.sfReplacing;
- *theFSSpec = reply.sfFile;
-
- return( true ); // return by "Open"
- }
-
- /***** Menu Operation *****/
- short GetMenuInd( MenuHandle menu, StringPtr text )
- {
- short item;
- Str255 itemString;
-
- for (item=1;item<=CountMItems(menu);++item) {
- GetItem( menu, item, itemString );
- // if ( Pstrcmp(text,itemString) == 0 ) return( item );
- if ( Pstrncmp(text,itemString,4) == 0 ) return( item );
- }
-
- return( 0 );
- }
-
- typedef struct {
- MenuHandle mHandle;
- short mID;
- char mPrivate;
- } popupPrivateData, *popupPrivatePtr, **popupPrivateHandle;
-
- short TrackPopupMenu( ControlHandle theCntl )
- {
- WindowPtr window;
- MenuHandle menu;
- short menuID;
- short item;
- Point menuSize;
- Rect itemRect;
- short itemNumb;
- Point mousePos;
- Boolean result;
- GrafPtr oldPort;
-
- window = (**theCntl).contrlOwner;
-
- // menuID = GetCRefCon( theCntl ); // Note: 'RefCon' shold hold menuID !!
- // menu = GetMenu( menuID );
- menuID = ( (popupPrivateData *) (*((**theCntl).contrlData)))->mID;
- menu = ( (popupPrivateData *) (*((**theCntl).contrlData)))->mHandle;
- if ( menu == nil ) return( 0 ); // If no menu for the Control, return( 0 )
- itemNumb = CountMItems( menu );
- menuSize.h = (**menu).menuWidth;
- menuSize.v = (**menu).menuHeight;
-
- item = GetCtlValue( theCntl );
-
- itemRect = (**theCntl).contrlRect;;
- itemRect.top += 1;
- itemRect.left += 1;
- itemRect.bottom = itemRect.top + menuSize.v/itemNumb;
- itemRect.right = itemRect.left + menuSize.h;
-
- result = false;
-
- GetPort( &oldPort );
- SetPort( window );
-
- if ( menuSize.h < 0 && menuSize.v < 0 ) result = true;
-
- GetMouse( &mousePos );
- if( PtInRect( mousePos, &itemRect ) ) result = true;
-
- SetPort( oldPort );
-
- if ( ! result ) item = 0;
-
- return( item ); // If mouse was released outside the menu, return( 0 )
- }
-
- // end of program
-